/*
===========================================================================

Doom 3 BFG Edition GPL Source Code
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.

This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").

Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Doom 3 BFG Edition Source Code.  If not, see <http://www.gnu.org/licenses/>.

In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code.  If not, please request a copy in writing from id Software at the address below.

If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.

===========================================================================
*/

#ifndef __D_PLAYER__
#define __D_PLAYER__


// The player data structure depends on a number
// of other structs: items (internal inventory),
// animation states (closely tied to the sprites
// used to represent them, unfortunately).
#include "d_items.h"
#include "p_pspr.h"

// In addition, the player is just a special
// case of the generic moving object/actor.
#include "p_mobj.h"

// Finally, for odd reasons, the player input
// is buffered within the player data struct,
// as commands per game tick.
#include "d_ticcmd.h"

#ifdef __GNUG__
	#pragma interface
#endif




//
// Player states.
//
typedef enum
{
	// Playing or camping.
	PST_LIVE,
	// Dead on the ground, view follows killer.
	PST_DEAD,
	// Ready to restart/respawn???
	PST_REBORN

} playerstate_t;


//
// Player internal flags, for cheats and debug.
//
typedef enum
{
	// No clipping, walk through barriers.
	CF_NOCLIP		= 1,
	// No damage, no health loss.
	CF_GODMODE		= 2,
	// Not really a cheat, just a debug aid.
	CF_NOMOMENTUM	= 4,

	// Gives kfa at the beginning of the level.
	CF_GIVEALL		= 8,

	CF_INFAMMO		= 16,
} cheat_t;


//
// Extended player object info: player_t
//
typedef struct player_s
{
	mobj_t*		mo;
	playerstate_t	playerstate;
	ticcmd_t		cmd;

	// Determine POV,
	//  including viewpoint bobbing during movement.
	// Focal origin above r.z
	fixed_t		viewz;
	// Base height above floor for viewz.
	fixed_t		viewheight;
	// Bob/squat speed.
	fixed_t         	deltaviewheight;
	// bounded/scaled total momentum.
	fixed_t         	bob;

	// This is only used between levels,
	// mo->health is used during levels.
	int			health;
	int			armorpoints;
	// Armor type is 0-2.
	int			armortype;

	// Power ups. invinc and invis are tic counters.
	int			powers[NUMPOWERS];
	qboolean		cards[NUMCARDS];
	qboolean		backpack;

	// Frags, kills of other players.
	int			frags[MAXPLAYERS];
	weapontype_t	readyweapon;

	// Is wp_nochange if not changing.
	weapontype_t	pendingweapon;

	int		weaponowned[NUMWEAPONS];
	int			ammo[NUMAMMO];
	int			maxammo[NUMAMMO];

	// True if button down last tic.
	int			attackdown;
	int			usedown;

	// Bit flags, for cheats and debug.
	// See cheat_t, above.
	int			cheats;

	// Refired shots are less accurate.
	int			refire;

	// For intermission stats.
	int			killcount;
	int			itemcount;
	int			secretcount;

	int			chainsawKills;
	int			berserkKills;

	// Hint messages.
	const char*		message;

	// For screen flashing (red or bright).
	int			damagecount;
	int			bonuscount;

	// Who did damage (NULL for floors/ceilings).
	mobj_t*		attacker;

	// So gun flashes light up areas.
	int			extralight;

	// Current PLAYPAL, ???
	//  can be set to REDCOLORMAP for pain, etc.
	int			fixedcolormap;

	// Player skin colorshift,
	//  0-3 for which color to draw player.
	int			colormap;

	// Overlay view sprites (gun, etc).
	pspdef_t		psprites[NUMPSPRITES];

	// True if secret level has been done.
	qboolean		didsecret;

} player_t;


//
// INTERMISSION
// Structure passed e.g. to WI_Start(wb)
//
typedef struct
{
	qboolean	in;	// whether the player is in game

	// Player stats, kills, collected items etc.
	int		skills;
	int		sitems;
	int		ssecret;
	int		stime;
	int		frags[4];
	int		score;	// current score on entry, modified on return

} wbplayerstruct_t;

typedef struct
{
	int		epsd;	// episode # (0-2)

	// if true, splash the secret level
	qboolean	didsecret;

	// previous and next levels, origin 0
	int		last;
	int		next;

	int		maxkills;
	int		maxitems;
	int		maxsecret;
	int		maxfrags;

	// the par time
	int		partime;

	// index of this player in game
	int		pnum;

	wbplayerstruct_t	plyr[MAXPLAYERS];

} wbstartstruct_t;


#endif

